function add(a, b, c) {
    return a + b + c
}

function curry(fn) {
     let judge = (...args) => {
        if (args.length === fn.length) return fn(...args)
        return (...arg) => judge(...args, ...arg)
    }
    return judge
}
let addCurry = curry(add)
const res1 = addCurry(1, 2)(3)
const res2 = addCurry(1)(2)(3)
console.log(res1);
console.log(res2);

// //  通用实现1
// function currying(fn, length) {
//     length = length || fn.length;
//     return function (...args) {
//         return args.length >= length
//             ? fn.apply(this, args)
//             : currying(fn.bind(this, ...args), length - args.length)
//     }
// }
// //  通用实现2
// function currying(fn, length) {
//     return function (...args) {
//         if (args.length >= length) {
//             return args.slice(0, length).reduce((t, i) => t += i);
//         }
//         return function (..._args) {
//             return add.apply(null, [...args, ..._args]);
//         }
//     }
// }
// function add(...args) {
//     return args.reduce((t, i) => t + i)
// }
// var newAdd = currying(add, 3)
// console.log(newAdd(Array.prototype.unshift, 2, 3))
// console.log(newAdd(Array.prototype.unshift, 2)(3))
